/*
 * MjestaSessionBean.java
 *
 */

package hr.ctg.service.dao;

import hr.ctg.domain.model.Mjesto;
import hr.jpa.dao.GenericDAOImpl;

import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

/**
 * 
 * @author ivica
 */

@AutoCreate
@Name("mjestoDAO")
public class MjestoDAO extends GenericDAOImpl<Mjesto, Integer> {
	@In
	Session session;

	@Override
	@SuppressWarnings("unchecked")
	public List<Mjesto> findAll() {
		return entityManager.createNamedQuery("Mjesto.findAll").getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByOcjena(final Integer max) {
		return entityManager.createNamedQuery("Mjesto.findTopByOcjena")
				.setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByOcjenaIdTipaObjekta(
			final Integer idTipaObjekta, final Integer max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByOcjenaIdTipaObjekta").setParameter(1,
				idTipaObjekta).setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetObjektaIdTipaObjekta(
			final Integer idTipaObjekta, final Integer max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByPosjetObjektaIdTipaObjekta").setParameter(1,
				idTipaObjekta).setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetMjesta(final Integer max) {
		return entityManager.createNamedQuery("Mjesto.findTopByPosjetMjesta")
				.setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetMjestaPanormaioNotNull(final Integer max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByPosjetMjestaPanormaioNotNull").setMaxResults(
				max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetMjesta(final String jezik,
			final Integer max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByPosjetMjestaJezik").setParameter(1, jezik)
				.setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetMjestaJezik(final Integer max,
			final String jezik) {
		return session.getNamedQuery("Mjesto.findTopByPosjetMjestaJezik")
				.setCacheable(true).setParameter(0, jezik).setMaxResults(max)
				.list();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByObjekti() {
		return entityManager.createNamedQuery("Mjesto.findByObjekti")
				.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByOcjenaIdZupanije(final Integer idZupanije,
			final int max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByOcjenaIdZupanije").setParameter(1, idZupanije)
				.setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetMjestaIdZupanije(
			final Integer idZupanije, final int max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByPosjetMjestaIdZupanije").setParameter(1,
				idZupanije).setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByOcjenaIdTipaObjektaIdZupanije(
			final Integer idZupanije, final int idTipaObjekta, final int max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByOcjenaIdTipaObjektaIdZupanije").setParameter(
				1, idZupanije).setParameter(2, idTipaObjekta)
				.setMaxResults(max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetObjektaIdTipaObjektaIdZupanije(
			final Integer idZupanije, final int idTipaObjekta, final int max) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByPosjetObjektaIdTipaObjektaIdZupanije")
				.setParameter(1, idZupanije).setParameter(2, idTipaObjekta)
				.setMaxResults(max).getResultList();
	}

	public long findCountTopByOcjenaIdZupanije(final Integer idZupanije) {
		return (Long) entityManager.createNamedQuery(
				"Mjesto.findCountTopByOcjenaIdZupanije").setParameter(1,
				idZupanije).getSingleResult();
	}

	public long findCountTopByPosjetMjestaIdZupanije(final Integer idZupanije) {
		return (Long) entityManager.createNamedQuery(
				"Mjesto.findCountTopByPosjetMjestaIdZupanije").setParameter(1,
				idZupanije).getSingleResult();
	}

	public long findCountTopByOcjenaIdTipaObjektaIdZupanije(
			final Integer idZupanije, final Integer idTipaObjekta) {
		return (Long) entityManager.createNamedQuery(
				"Mjesto.findCountTopByOcjenaIdTipaObjektaIdZupanije")
				.setParameter(1, idZupanije).setParameter(2, idTipaObjekta)
				.getSingleResult();
	}

	public long findCountTopByPosjetObjektaIdTipaObjektaIdZupanije(
			final Integer idZupanije, final Integer idTipaObjekta) {
		return (Long) entityManager.createNamedQuery(
				"Mjesto.findCountTopByPosjetObjektaIdTipaObjektaIdZupanije")
				.setParameter(1, idZupanije).setParameter(2, idTipaObjekta)
				.getSingleResult();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByIdZupanije(final Integer idZupanije) {
		return entityManager.createNamedQuery("Mjesto.findByIdZupanije")
				.setParameter(1, idZupanije).getResultList();
	}
	@SuppressWarnings("unchecked")
	public List<Mjesto> findByIdZupanije(final Integer idZupanije, int first,
			int max) {
		return entityManager.createNamedQuery("Mjesto.findByIdZupanije")
				.setParameter(1, idZupanije).setFirstResult(first).setMaxResults(max).getResultList();
	}
	public Long countByIdZupanije(final Integer idZupanije){
		return (Long)entityManager.createNamedQuery("Mjesto.findCountByIdZupanije")
		.setParameter(1, idZupanije).getSingleResult();
	}

	@SuppressWarnings("unchecked")
	public Mjesto findByNaziv(final String nazivMjesta) {
		final List<Mjesto> mjesta = entityManager.createNamedQuery(
				"Mjesto.findByNaziv").setParameter(1, nazivMjesta)
				.getResultList();
		if (mjesta.size() > 0) {
			return mjesta.get(0);
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<String> findFirstLetters() {
		return entityManager.createNamedQuery("Mjesto.findFirstLetters")
				.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByFirstLetter(final String letter) {
		return entityManager.createNamedQuery("Mjesto.findByFirstLetter")
				.setParameter(1, letter).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<String> findFirstLettersByObjekti() {
		return entityManager.createNamedQuery(
				"Mjesto.findFirstLettersByObjekts").getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByFirstLetterObjekti(final String letter) {
		return entityManager
				.createNamedQuery("Mjesto.findByFirstLetterObjekti")
				.setParameter(1, letter).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<String> findFirstLettersByObjOpObj() {
		return entityManager.createNamedQuery(
				"Mjesto.findFirstLettersByObjOpObj").getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByFirstLetterObjOpObj(final String letter) {
		return entityManager.createNamedQuery(
				"Mjesto.findByFirstLetterObjOpObj").setParameter(1, letter)
				.getResultList();

	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByFirstLetterObjOpObjJezik(final String letter,
			final String jezik, int first, int max) {
		return entityManager.createNamedQuery(
				"Mjesto.findByFirstLetterObjOpObjJezik")
				.setParameter(1, letter).setParameter(2, jezik).setFirstResult(
						first).setMaxResults(max).getResultList();

	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByFirstLetter(final String letter, int first,
			int max) {
		return entityManager.createNamedQuery("Mjesto.findByFirstLetter")
				.setParameter(1, letter).setFirstResult(first).setMaxResults(
						max).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByIdOtoka(final Integer idOtoka) {
		return entityManager.createNamedQuery("Mjesto.findByIdOtoka")
				.setParameter(1, idOtoka).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByIdOtokaObjOpObj(final Integer idOtoka) {
		return entityManager.createNamedQuery("Mjesto.findByIdOtokaObjOpObj")
				.setParameter(1, idOtoka).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByIdOtokaObjekti(final Integer idOtoka) {
		return entityManager.createNamedQuery("Mjesto.findByIdOtokaObjekti")
				.setParameter(1, idOtoka).getResultList();
	}

	public List<Mjesto> findByIdZupanijeObjekti(final Integer idZupanije) {
		return executeNamedQuery("Mjesto.findByIdZupanijeObjekti", idZupanije);
	}

	public List<Mjesto> findByObjektiLikeNaziv(final String naziv) {
		return executeNamedQuery("Mjesto.findByObjektiLikeNaziv", naziv);
	}

	public List<Mjesto> findByIdZupanijeLikeNaziv(final Integer idZupanije,
			final String naziv) {
		return executeNamedQuery("Mjesto.findByIdZupanijeLikeNaziv",
				idZupanije, naziv);
	}

	public List<Mjesto> findByNazivOtokaLikeNaziv(final String nazivOtoka,
			final String naziv) {
		return executeNamedQuery("Mjesto.findByNazivOtokaLikeNaziv",
				nazivOtoka, naziv);
	}

	public List<Mjesto> findByIdPoste(final Integer idPoste) {
		return executeNamedQuery("Mjesto.findByIdPoste", idPoste);
	}

	public List<Mjesto> findByOOOIdZupanije(final Integer idZupanije) {
		return executeNamedQuery("Mjesto.findByOOOIdZupanije", idZupanije);
	}

	public List<Mjesto> findByOOOIdZupanijeJezik(final Integer idZupanije,
			final String jezik) {
		return executeNamedQuery("Mjesto.findByOOOIdZupanijeJezik", idZupanije,
				jezik);
	}
	@SuppressWarnings("unchecked")
	public List<Mjesto> findByOOOIdZupanijeJezik(final Integer idZupanije,
			final String jezik,int first,int max) {
		List<Mjesto> tmlList= entityManager.createNamedQuery("Mjesto.findByOOOIdZupanijeJezik")
		.setParameter(1, idZupanije)
		.setParameter(2, jezik)
		.setFirstResult(first)
		.setMaxResults(max).getResultList();
		return tmlList;
	}
	public int findCountByOOOIdZupanijeJezik(Integer idZupanije, String jezik) {
		return ((Long) entityManager.createNamedQuery(
				"Mjesto.findCountByOOOIdZupanijeJezik").setParameter(1,
						idZupanije).setParameter(2, jezik).getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByOcjenaIdOtoka(final Integer idOtoka,
			final int top) {
		return entityManager.createNamedQuery("Mjesto.findTopByOcjenaIdOtoka")
				.setParameter(1, idOtoka).setMaxResults(top).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findTopByPosjetMjestaIdOtoka(final Integer idOtoka,
			final int top) {
		return entityManager.createNamedQuery(
				"Mjesto.findTopByPosjetMjestaIdOtoka").setParameter(1, idOtoka)
				.setMaxResults(top).getResultList();
	}

	public List<Mjesto> findByIdOtokaObjOpObjJezik(final Integer idOtoka,
			final String jezik) {
		return executeNamedQuery("Mjesto.findByIdOtokaObjOpObjJezik", idOtoka,
				jezik);
	}

	public List<Mjesto> findByObjektiIdZupanije(final Integer idZupanije) {
		return executeNamedQuery("Mjesto.findByObjektiIdZupanije", idZupanije);
	}

	public List<Mjesto> findByLatLonOpisNotNull() {
		return executeNamedQuery("Mjesto.findByLatLonOpisNotNull");
	}

	public Long findBrojPosjeta(Integer idMjesta) {
		return (Long) entityManager.createNamedQuery("Mjesto.findBrojPosjeta")
				.setParameter(1, idMjesta).getSingleResult();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findByPanormaioNotNull(int max) {
		return ((Session) entityManager.getDelegate()).getNamedQuery(
				"Mjesto.findByPanormaioNotNull").setCacheable(true)
				.setMaxResults(max).list();
	}

	public int findCountByFirstLetterObjOpObjJezik(String letter, String jezik) {
		return ((Long) entityManager.createNamedQuery(
				"Mjesto.findCountByFirstLetterObjOpObjJezik").setParameter(1,
				letter).setParameter(2, jezik).getSingleResult()).intValue();
	}
	public int findCountByFirstLetter(String letter) {
		return ((Long) entityManager.createNamedQuery(
				"Mjesto.findCountByFirstLetter").setParameter(1,letter).getSingleResult()).intValue();
	}

	@SuppressWarnings("unchecked")
	public List<Mjesto> findNTopByPosjetMjesta(int top, Date startDate,
			Date endDate) {

		return session.getNamedQuery("Mjesto.findNTopByPosjetMjesta")
				.setCacheable(true).setParameter(0, startDate).setParameter(1,
						endDate).setMaxResults(top).list();
	}
}
